//
//  Util.m
//  Zinipad
//
//  Created by ZeLkOvA on 12. 6. 20..
//  Copyright (c) 2012년 __MyCompanyName__. All rights reserved.
//

#import "Util.h"
#import "Reachability.h"

@implementation Util
{
    
}

/**
 * 헥스코드를 UIColor로 변경
 * @param hexValue 컬러코드 6자리
 * @param alpha 투명도. 0~1
 * @return UIColor로 변경된 값
 */
+(UIColor*)hex2RGB:(NSString *)hexValue andAlpha:(float)alpha
{
    uint rDec;
    uint gDec;
    uint bDec;
    NSString* r = [hexValue substringWithRange:NSMakeRange(1, 2)];
    NSString* g = [hexValue substringWithRange:NSMakeRange(3, 2)];
    NSString* b = [hexValue substringWithRange:NSMakeRange(5, 2)];
    
    NSScanner* scan = [NSScanner scannerWithString:r];
    [scan scanHexInt:&rDec];
    
    scan = [NSScanner scannerWithString:g];
    [scan scanHexInt:&gDec];
    
    scan = [NSScanner scannerWithString:b];
    [scan scanHexInt:&bDec];
    
    return [UIColor colorWithRed:rDec/255.0f green:gDec/255.0f blue:bDec/255.0f alpha:alpha];
}

/**
 * 현재 네트워크 접속 가능한지 체크
 * @return 접속 가능 여부 BOOL 값
 */
+(BOOL)checkNetworkEnable
{
    int result = [[Reachability reachabilityForInternetConnection] currentReachabilityStatus];
    if(result == 0)
    {
        // 접속 불능 
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"알림" message:@"네트워크에 접속할 수 없습니다" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
        [alert release];
        
        return NO;
    }
    
    return YES;
}

/**
 * post 방식으로 http 요청
 * @param url 요청할 주소
 * @param data 담겨져 보내질 데이터
 * @return JSON 형식으로 넘어온 값을 NSDictionary로 변환한 값
 */
+(NSDictionary*)sendHTTPPost:(NSURL *)url sendData:(NSData *)data
{
    if(![self checkNetworkEnable])
    {
        return nil;
    }
    
    NSString *postLength = [NSString stringWithFormat:@"%d",[data length]];;
    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
    [request setURL:url];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Current-Type"];
    [request setHTTPBody:data];
    
    NSURLResponse* urlResponse = nil;
    NSError* requestError;
    
    NSData* responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError ];
    NSString* jsonString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    
    NSLog(@"requestURL & Data : %@?%@", url, [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
    NSLog(@"returnString : %@", jsonString);
    SBJSON* parser = [[SBJSON alloc] init];
    NSDictionary* returnDictionary = [parser objectWithString:jsonString error:nil];
    
    return returnDictionary;
}

/**
 * post 방식으로 https 요청
 * @param url 요청할 주소
 * @param dataArray 담겨져 보내질 데이터 배열
 * @return JSON 형식으로 넘어온 값을 NSDictionary로 변환한 값
 */
+(NSDictionary*)sendHTTPSPost:(NSURL *)url sendData:(NSArray *)dataArray
{
    ASIFormDataRequest* request = [ASIFormDataRequest requestWithURL:url];
    [request setValidatesSecureCertificate:NO];
    
    for(int i = 0; i < [dataArray count] - 1; i++)
    {
        [request addPostValue:[dataArray objectAtIndex:i] forKey:[dataArray objectAtIndex:i+1]];
    }
    [request startSynchronous];
    
    NSError* error = [request error];
    NSString* responseString = [NSString string];
    if(!error)
    {
        responseString = [request responseString];
        NSLog(@"response : %@", responseString);
    }
    else
    {
        NSLog(@"error : %@", error);
    }
    
    SBJSON* parser = [[SBJSON alloc] init];
    NSDictionary* returnDictionary = [parser objectWithString:responseString error:nil];
    
    return returnDictionary;
}

/**
 * get 방식으로 http 요청
 * @param url 요청할 주소. 파라미터들 포함
 * @return JSON 형식으로 넘어온 값을 NSDictionary로 변환한 값
 */
+(NSDictionary*)sendHTTPGetWithParameter:(NSURL*)url
{
    NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:url
                                                           cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                                                       timeoutInterval:10];
    
    [request setHTTPMethod: @"GET"];
    
    NSError* requestError;
    NSURLResponse* urlResponse = nil;
    
    NSData* response = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&requestError];
    NSString* jsonString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];
    
    NSLog(@"returnString : %@", jsonString);
    
    SBJSON* parser = [[SBJSON alloc] init];
    NSDictionary* returnDictionary = [parser objectWithString:jsonString error:nil];
    
    return returnDictionary;
}

/**
 * get 방식으로 https 요청
 * @param url 요청할 주소. 파라미터들 포함
 * @return JSON 형식으로 넘어온 값을 NSDictionary로 변환한 값
 */
+(NSDictionary*)sendHTTPSGetWithParameter:(NSURL *)url
{
    ASIHTTPRequest* request = [ASIHTTPRequest requestWithURL:url];
    NSError* error = [request error];
    NSString* responseString = [NSString string];
    if(!error)
    {
        responseString = [request responseString];
        NSLog(@"response : %@", responseString);
    }
    else
    {
        NSLog(@"error : %@", error);
    }
    
    SBJSON* parser = [[SBJSON alloc] init];
    NSDictionary* returnDictionary = [parser objectWithString:responseString error:nil];
    
    return returnDictionary;
}

/**
 * 파일 쓰기
 * @param dirName 파일 쓸 폴더 이름
 * @param fileName 파일 이름
 * @param data 파일에 쓸 내용
 * @param isReplace 덮어씌울지 여부. NO일 경우 기존 내용 뒤에 이어서 씀
 * @return 음슴
 */
+(void)writeFileAtDir:(NSString *)dirName andFileName:(NSString *)fileName andData:(NSString *)data isOverWrite:(BOOL)isReplace
{
    NSString* pastData = @"";
    if(isReplace == NO)
    {
        pastData = [self readFileAtDir:dirName andFileName:fileName];
    }
    
    NSArray* pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* docDir = [pathArray objectAtIndex:0];
    NSString* dirPath = [docDir stringByAppendingPathComponent:dirName];
    
    if(![[NSFileManager defaultManager] fileExistsAtPath:dirPath])
    {
        [[NSFileManager defaultManager] createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];
    }
    
    NSString* filePath = [dirPath stringByAppendingPathComponent:fileName];
    [[NSFileManager defaultManager] createFileAtPath:filePath contents:nil attributes:nil];
    
    NSData* contentData = [[NSString stringWithFormat:@"%@%@", pastData, data] dataUsingEncoding:NSUTF8StringEncoding];
    NSFileHandle* fileHandle = [NSFileHandle fileHandleForWritingAtPath:filePath];
    [fileHandle writeData:contentData];
    [fileHandle closeFile];
    
    NSLog(@"file write end : %@", fileName);
}

/**
 * 파일 읽기
 * @param dirName 대상 폴더 이름
 * @param fileName 파일 이름
 * @return 파일 내용
 */
+(NSString*)readFileAtDir:(NSString *)dirName andFileName:(NSString *)fileName
{
    NSArray* pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* docDir = [pathArray objectAtIndex:0];
    NSString* dirPath = [docDir stringByAppendingPathComponent:dirName];
    NSString* filePath = [dirPath stringByAppendingPathComponent:fileName];
    
    NSString* fileData = [NSString string];
    
    if([[NSFileManager defaultManager] fileExistsAtPath:filePath])
    {
        fileData = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    }
    else
    {
        NSLog(@"there is no %@", fileName);
        return nil;
    }
    
    NSLog(@"file read end : %@ = %@", fileName, fileData);
    
    return fileData;
}

/**
 * 폴더에있는 파일명 리스트 요청
 * @param dirName 대상 폴더 이름
 * @return 파일명 리스트
 */
+(NSArray*)getFileList:(NSString*)dirName
{
    NSArray* pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* docDir = [pathArray objectAtIndex:0];
    NSString* dirPath = [docDir stringByAppendingPathComponent:dirName];
    
    NSArray* fileList = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dirPath error:NULL];
    int count = [fileList count];
    
    for(int i = 0; i < count; i++)
    {
        NSLog(@"%@", [fileList objectAtIndex:i]);
    }
    
    return fileList;
}

/**
 * 파일 삭제
 * @param dirName 대상 폴더 이름
 * @param fileName 파일 이름
 * @return 음슴
 */
+(void)deleteFileAtDir:(NSString*)dirName andFileName:(NSString*)fileName
{
    NSArray* pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* docDir = [pathArray objectAtIndex:0];
    NSString* dirPath = [docDir stringByAppendingPathComponent:dirName];
    NSString* filePath = [dirPath stringByAppendingPathComponent:fileName];
    
    if([[NSFileManager defaultManager] removeItemAtPath:filePath error:nil] != NO)
    {
        NSLog(@"file deleted : %@/%@", dirName, fileName);
    }
    else
    {
        NSLog(@"there is no %@/%@", dirName, fileName);
    }
}

/**
 * 폴더 안에있는 모든 파일 삭제
 * @param dirName 대상 폴더 이름
 * @return 음슴
 */
+(void)deleteAllFilesAtDir:(NSString*)dirName
{
    NSArray* fileArray = [self getFileList:dirName];
    int fileArrayCount = [fileArray count];
    for(int i = 0; i < fileArrayCount; i++)
    {
        [self deleteFileAtDir:dirName andFileName:[fileArray objectAtIndex:i]];
    }
}

/**
 * 모달뷰 여러개 열어놨을때 가장 첫번째 모달뷰로 이동
 * @param viewController 닫히기 시작하는 뷰컨트롤러 (보통 함수 호출하는 뷰컨트롤러)
 * @return 음슴
 */
+(void)popModalsToFirstFrom:(UIViewController*)viewController
{
    float iOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if(iOSVersion >= 5.0)
    {
        if(viewController.presentingViewController.presentingViewController == nil)
        {
            return;
        }
        else
        {
            [Util popModalsToFirstFrom:viewController.presentingViewController];  // recursive call to this method
            [viewController.presentingViewController dismissModalViewControllerAnimated:NO];
        }
    }
    else
    {
        if(viewController.parentViewController.parentViewController == nil)
        {
            return;
        }
        else
        {
            [Util popModalsToFirstFrom:viewController.parentViewController];  // recursive call to this method
            [viewController.parentViewController dismissModalViewControllerAnimated:NO];
        }
    }
}

/**
 * 글자수에 따른 바이트 계산
 * @param targetString 계산할 문자열
 * @return 계산된 바이트 수
 */
+(int)getStringBytes:(NSString *)targetString
{
    // 실제 바이트 상관없이 무조건 한글은 2, 영문/숫자는 1
    int stringByte = 0;
    stringByte = [targetString lengthOfBytesUsingEncoding:0x80000000 + kCFStringEncodingDOSKorean];
    
    return stringByte;
}

/**
 * 이미지 자르기
 * @param targetImageName 타겟 이미지 이름
 * @param targetX 잘라낼 부분의 x 시작 좌표
 * @param targetY 잘라낼 부분의 y 시작 좌표
 * @param targetWidth 잘라낼 부분의 가로 길이
 * @param targetHeight 잘라낼 부분의 세로 길이
 * @param resultX 리턴될 이미지뷰의 x위치
 * @param resultY 리턴될 이미지뷰의 y위치
 * @param resultWidth 리턴될 이미지뷰의 가로 길이
 * @param resultHeight 리턴될 이미지뷰의 세로 길이
 * @return 잘려져서 리사이즈 된 이미지뷰
 */
+(UIImageView *)cropImage:(NSString *)targetImageName targetX:(float)targetX targetY:(float)targetY targetWidth:(float)targetWidth targetHeight:(float)targetHeight resultX:(float)resultX resultY:(float)resultY resultWidth:(float)resultWidth resultHeight:(float)resultHeight
{
    UIImage* image = [UIImage imageNamed:targetImageName];
    UIImageView* imageView = [[UIImageView alloc] initWithImage:image];
    
    // 잘라낼 영역
    CGRect rect = CGRectMake(targetX, targetY, targetWidth, targetHeight);
    
    // 잘라낸 부분으로 이미지 생성
    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rect);
    UIImage* img = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef);
    
    // 잘린이미지 화면에 출력
    imageView = [[UIImageView alloc] initWithImage:img];
    [imageView setFrame:CGRectMake(resultX, resultY, resultWidth, resultHeight)];
    
    return imageView;
}

/**
 * 이미지를 타일 형식으로 정해진 영역에 배치
 * @param targetImageName 타겟 이미지 이름
 * @param resultX 리턴될 이미지뷰의 x위치
 * @param resultY 리턴될 이미지뷰의 y위치
 * @param resultWidth 리턴될 이미지뷰의 가로 길이
 * @param resultHeight 리턴될 이미지뷰의 세로 길이
 * @return 이미지를 타일로 배치한 이미지뷰
 */
+(UIImageView *)tileImage:(NSString *)targetImageName resultX:(float)resultX resultY:(float)resultY resultWidth:(float)resultWidth resultHeight:(float)resultHeight
{
    // 뷰에 이미지 타일로 배치
    UIImage* image = [UIImage imageNamed:targetImageName];
    UIImageView* imageView = [[UIImageView alloc] initWithFrame:CGRectMake(resultX, resultY, resultWidth, resultHeight)];
    [imageView setImage:image];
    
    CGSize imageViewSize = imageView.bounds.size;
    
    UIGraphicsBeginImageContext(imageViewSize);
    CGRect imageRect;
    imageRect.origin = CGPointMake(0.0, 0.0);
    imageRect.size = CGSizeMake(image.size.width, image.size.height);
    
    CGContextRef imageContext = UIGraphicsGetCurrentContext();
    CGContextScaleCTM(imageContext, 1.0f, -1.0f);   // 이미지 뒤집히는거 바로잡음
    CGContextDrawTiledImage(imageContext, imageRect, image.CGImage);
    
    UIImage *finishedImage = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    imageView.image = finishedImage;
    
    return imageView;
}
+(NSInteger)findCategory:(int)_rootIndex sub:(int)_subIndex
{
    NSInteger nCode;
    if(_subIndex < 10)
       nCode = [[NSString stringWithFormat:@"%d0%d",_rootIndex+1,_subIndex+1] intValue];
    else 
        nCode = [[NSString stringWithFormat:@"%d%d",_rootIndex+1,_subIndex+1] intValue];
    return nCode;
}
+(NSString*)findFloorRootCategoryName:(int)_index
{
    NSString* str;
    switch (_index) {
        case 0:
            str = @"마루";
            break;
        case 1:
            str = @"시트";
            break;
        case 2:
            str = @"타일";
            break;
        case 3:
            str = @"타일";
            break;
        case 4:
            str = @"시트";
            break;
        case 5:
            str = @"카펫타일";
            break;
        case 6:
            str = @"스톤타일";
            break;

        default:
            break;
    }
    return str;
}
+(NSString*)findWallpaperRootCategoryName:(int)_index
{
    NSString* str;
    switch (_index) {
        case 0:
            str = @"프리미엄벽지";
            break;
        case 1:
            str = @"실크벽지";
            break;
        case 2:
            str = @"합지벽지";
            break;
        case 3:
            str = @"벽타일";
            break;
            
        default:
            break;
    }
    return str;
}
//-(UIImage*)CropImage:(UIBezierPath *)trackPath{
//    CGContextRef mainViewContentContext;
//    CGColorSpaceRef colorSpace;
//    
//    colorSpace = CGColorSpaceCreateDeviceRGB();
//    
//    // create a bitmap graphics context the size of the image
//    mainViewContentContext = CGBitmapContextCreate(NULL, aImgView.frame.size.width, aImgView.frame.size.height, 8, aImgView.frame.size.width*4, colorSpace, kCGImageAlphaPremultipliedLast);
//    
//    // free the rgb colorspace
//    CGColorSpaceRelease(colorSpace);
//    
//    //Translate and scale image
//    CGContextTranslateCTM(mainViewContentContext, 0, aImgView.frame.size.height);
//    CGContextScaleCTM(mainViewContentContext, 1.0, -1.0);
//    
//    //the mask
//    CGContextAddPath(mainViewContentContext, trackPath.CGPath);
//    CGContextClip(mainViewContentContext);
//    
//    //Translate and scale image
//    CGContextTranslateCTM(mainViewContentContext, 0, aImgView.frame.size.height);
//    CGContextScaleCTM(mainViewContentContext, 1.0, -1.0);
//    
//    //the main image
//    CGContextDrawImage(mainViewContentContext, CGRectMake(0, 0, aImgView.frame.size.width, aImgView.frame.size.height), aImgView.image.CGImage);
//    
//    //the outline
//    CGContextSetLineWidth(mainViewContentContext, 1);
//    CGContextSetRGBStrokeColor(mainViewContentContext, 181.0/256, 181.0/256, 181.0/256, 1.0);
//    
//    // Create CGImageRef of the main view bitmap content, and then
//    // release that bitmap context
//    CGImageRef mainViewContentBitmapContext = CGBitmapContextCreateImage(mainViewContentContext);
//    CGContextRelease(mainViewContentContext);
//    
//    // convert the finished resized image to a UIImage
//    UIImage *newImage = [UIImage imageWithCGImage:mainViewContentBitmapContext];
//    
//    // image is retained by the property setting above, so we can
//    // release the original
//    CGImageRelease(mainViewContentBitmapContext);
//    
//    return newImage;
//}
//

@end
